package com.hyacinth.dubbo.io.netty.monitor;

import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.timeout.IdleStateEvent;
import io.netty.handler.timeout.IdleStateHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.TimeUnit;

/**
 * IM系统状态检测处理器
 * @author zhangfb
 * @version 1.0.0.1
 * @since JDK 1.8
 */
public class IMIdleStateHandler extends IdleStateHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(IMIdleStateHandler.class);

    private static final int READER_IDLE_TIME = 15;

    public IMIdleStateHandler() {
        /*
         * @param readerIdleTime 读空闲时长
         *      是在这段时间内如果没有数据读到，就表示连接假死；
         * @param writerIdleTime 写空闲时长
         *      在这段时间如果没有写数据，就表示连接假死；
         * @param allIdleTime    读写空闲时间
         *      这段时间内如果没有产生数据读或者写，就表示连接假死
         *      写空闲和读写空闲为0，表示我们不关心者两类条件
         * @param unit           时间单位
         */
        super(READER_IDLE_TIME, 0, 0, TimeUnit.SECONDS);
    }

    @Override
    protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) throws Exception {
        System.out.println(READER_IDLE_TIME + "秒内未读到数据，关闭连接");
        ctx.channel().close();
    }
}
